/**
 * 广播服务：管理所有云手机客户端（StreamClientScrcpy实例）
 * 负责将消息发送到所有注册的云手机
 */
import { ControlMessage } from '../controlMessage/ControlMessage';
import { StreamClientScrcpy } from '../googDevice/client/StreamClientScrcpy'; // 假设的导入路径

export class BroadcastService {
	// 存储所有活跃的云手机客户端（key: clientId, value: StreamClientScrcpy实例）
	private activeClients = new Map<number, StreamClientScrcpy>();
	private cloudPhoneInstances : StreamClientScrcpy[] = [];
	// 单例实例
	private static instance : BroadcastService;
	// 私有构造函数，防止外部实例化
	private constructor() {

	}

	// 获取单例实例
	static getInstance() : BroadcastService {
		if (!BroadcastService.instance) {
			BroadcastService.instance = new BroadcastService();
		}
		return BroadcastService.instance;
	}

	/**
	 * 注册云手机客户端（云手机连接成功时调用）
	 * @param client StreamClientScrcpy实例（必须包含clientId和sendMessage）
	 */
	registerClient(client : StreamClientScrcpy) : void {
		this.cloudPhoneInstances.unshift(client)
		// 验证客户端有效性（关键：确保有sendMessage方法）
		if (!client || !(client.player as any).udid || typeof client.sendMessage !== 'function') {
			console.error('注册失败：无效的StreamClientScrcpy实例', client);
			return;
		}
		// // 避免重复注册
		// if (this.activeClients.has(client.clientId)) {
		//     console.warn(`客户端 ${client.clientId} 已注册，无需重复注册`);
		//     return;
		// }
	}

	/**
	 * 注销云手机客户端（云手机断开时调用）
	 * @param clientId 客户端唯一标识
	 */
	unregisterClient() : void {
		this.cloudPhoneInstances.forEach(client => {
			client.onDisconnected()
			client.destroy();
		});
		this.cloudPhoneInstances=[]
	}

	/**
	 * 广播消息到所有注册的云手机
	 * @param sourceClient 发送源客户端（用于排除自身）
	 * @param message 要广播的消息
	 * @param excludeSelf 是否排除发送源（默认true）
	 */
	broadcastToAll(
		sourceClient : StreamClientScrcpy,
		message : ControlMessage,
		excludeSelf : boolean = true
	) : void {
		//验证参数
		if (!sourceClient || !(sourceClient.player as any).udid) {
			console.error('广播失败：发送源客户端无效');
			return;
		}
		if (!(message instanceof ControlMessage)) {
			console.error('广播失败：消息必须是ControlMessage实例');
			return;
		}
		// 遍历所有客户端发送消息
		this.cloudPhoneInstances.forEach(client => {
			// // 排除自身（如果需要）
			if (excludeSelf && (client.player as any).udid === (sourceClient.player as any).udid) {
				return;
			}
			try {
				// 调用客户端的sendMessage发送消息（核心）
				// console.log(message);
				// console.log((client.player as any).udid);
				client.sendMessage(message);
				// console.log(`已向客户端 ${(sourceClient.player as any).udid} 广播消息（类型：${message.type}）`);
			} catch (error) {

			}
		});
	}
	//把云手机本地键盘还是云手机自带键盘开关群体设置
	change_keyboard_ToAll(sourceClient : StreamClientScrcpy, checked : boolean = true, excludeSelf : boolean = true) : void {
		// 遍历所有客户端发送消息
		this.cloudPhoneInstances.forEach(client => {
			// // 排除自身（如果需要）
			if (excludeSelf && (client.player as any).udid === (sourceClient.player as any).udid) {
				return;
			}
			try {
				client.setHandleKeyboardEvents(checked);
			} catch (error) {

			}
		});
	}
	/**
	 * 获取当前所有活跃客户端（用于调试）
	 */
	getActiveClients() : Map<number, StreamClientScrcpy> {
		return new Map(this.activeClients); // 返回副本，避免外部修改
	}
	getAllClients() : StreamClientScrcpy[] {
		// 返回副本，避免外部直接修改内部数组
		return [...this.cloudPhoneInstances];
	}
}